Suponha que não soubéssemos quantas espécies diferentes estão presentes no dataset iris. Como poderíamos descobrir essa informação aproximadamente a partir dos dados presentes ali?

Uma solução possível seria plotar os dados em um scatterplot e tentar identificar visualmente a existência de grupos distintos. O datase Iris, no entanto, possui quatro dimensões de dados então não é possível visualizá-lo inteiramente (apenas um par de features por vez).

Para visualizar o dataset completo como um scatterplot 2D, é possível usar técnicas de redução de dimensionalidade para comprimir o dataset para duas dimensões perdendo pouca informação estrutural.

Leitura dos dados


In [ ]:
import pandas as pd

iris = # Carregue o arquivo 'datasets/iris_without_classes.csv'

In [ ]:
# Exiba as primeiras cinco linhas usando o método head() para checar que não existe mais a coluna "Class"

Redução de dimensões

Usaremos o algoritmo PCA do scikit-learn para reduzir o número de dimenSões para dois no dataset.


In [ ]:
from sklearn.decomposition import PCA

RANDOM_STATE=1234
pca_model = # Crie um objeto PCA com dois componentes
iris_2d = # Use o método fit_transform() para reduzir o dataset para duas dimensões

In [ ]:
import matplotlib.pyplot as plt
%matplotlib inline

# Crie um scatterplot do dataset reduzido

# Exiba o gráfico

Quantos grupos distintos você consegue identificar?

Descoberta de clusters com K-Means

O problem descrito anteriormente pode ser descrito como um problema de Clusterização. Clusterização permite encontrar grupos de exemplos que sejam semelhantes a outros exemplos no mesmo grupo mas diferentes de exemplos pertencentes a outros grupos.

Neste exemplo, usaremos o algoritmo KMeans do scikit-learn para encontrar cluster no dataset.

Uma limitação do KMeans é que ele precisa receber o número esperado de clusters como argumento, então é necessário que se tenha algum conhecimento daquele domínio para chutar um número razoável de grupos ou pode-se testar diferentes números de clusters e ver qual deles apresenta o melhor resultado.


In [ ]:
# Crie dois modelos KMeans: um com dois clusters e outro com três clusters
# Armazene os identificadores previstos pelos modelos usando dois e três clusters
from sklearn.cluster import KMeans

model2 =  # Crie um objeto KMeans que espere dois clusters
labels2 = # Infira o identificador de cluster de cada exemplo no dataset usando predict()

model3 =  # Crie um objeto KMeans que espere três clusters
labels3 = # Infira o identificador de cluster de cada exemplo no dataset usando predict()

In [ ]:
# Crie um scatterplot usando o dataset reduzido colorindo cada ponto de acordo com o cluster
# ao qual ele pertence segundo o KMeans de dois clusters

# Exiba o scatterplot

In [ ]:
# Crie um scatterplot usando o dataset reduzido colorindo cada ponto de acordo com o cluster
# ao qual ele pertence segundo o KMeans de três clusters

# Exiba o scatterplot

Recursos adicionais

Existem técnicas como Análise de Silhueta para inferir automaticamente o número ótimo de clusters em um dataset. Este link ilustra com um exemplo como essa técnica pode ser implementada usando o scikit-learn.

Em relação a redução de dimensionalidade, PCA é uma das técnicas mais usadas em experimentos iniciais. Algumas alternativas comuns ao KMeans e PCA são, respectivamente, DBSCAN e t-SNE. Para uma excelente explicação interativa sobre o t-SNE, veja esse link.